#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    int i, j, n;
    char *temp; // 用于交换的临时指针
    char buffer[81]; // 用于临时存储输入的字符串
    char **color; // 指针数组，用于存储字符串的指针

    // 输入字符串的数量
    printf("请输入字符串的数量：");
    scanf("%d", &n);
    getchar(); // 吸收换行符

    // 动态分配指针数组的内存
    color = (char **) malloc(n * sizeof(char *));
    if (color == NULL) {
        printf("内存分配失败！\n");
        return 1;
    }

    // 输入n个字符串
    for (i = 0; i < n; i++) {
        printf("请输入第%d个字符串：", i + 1);
        fgets(buffer, 81, stdin);
        buffer[strcspn(buffer, "\n")] = '\0'; // 去除换行符
        color[i] = (char *) malloc((strlen(buffer) + 1) * sizeof(char));
        if (color[i] == NULL) {
            printf("内存分配失败！\n");
            return 1;
        }
        strcpy(color[i], buffer); // 将输入的字符串复制到指针数组中
    }

    // 使用冒泡排序对指针数组中的字符串进行升序排序
    for (i = 0; i < n - 1; i++) {
        for (j = i + 1; j < n; j++) {
            if (strcmp(color[i], color[j]) > 0) {
                // 交换指针数组中的指针
                temp = color[i];
                color[i] = color[j];
                color[j] = temp;
            }
        }
    }

    // 输出排序后的字符串
    printf("排序后的字符串：\n");
    for (i = 0; i < n; i++) {
        printf("%s\n", color[i]);
    }

    // 释放动态分配的内存
    for (i = 0; i < n; i++) {
        free(color[i]);
    }
    free(color);

    return 0;
}
